<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>getPrototypeOf&setPrototypeOf</title>
	</head>
	<body>
    <script>
      // getPrototypeOf
      function FancyThing () {
        this.name = '张三'
      }
      const myObj = new FancyThing();
      // 旧写法
      Object.getPrototypeOf(myObj) === FancyThing.prototype;
      // 新写法
      Reflect.getPrototypeOf(myObj) === FancyThing.prototype;
      // 区别：如果参数不是对象，Object.getPrototypeOf会将这个参数转为对象，然后再运行，而Reflect.getPrototypeOf会报错。
      Object.getPrototypeOf(1) // Number {[[PrimitiveValue]]: 0}
      Reflect.getPrototypeOf(1) // 报错
      
      // setPrototypeOf
      const myObj = {};
      // 旧写法
      Object.setPrototypeOf(myObj, Array.prototype);
      // 新写法
      Reflect.setPrototypeOf(myObj, Array.prototype);
      myObj.length // 0
      // 无法设置时返回false
      Reflect.setPrototypeOf({}, null)
      // true
      Reflect.setPrototypeOf(Object.freeze({}), null)
      // false
      // 区别：如果第一个参数不是对象，Object.setPrototypeOf会返回第一个参数本身，而Reflect.setPrototypeOf会报错
      Object.setPrototypeOf(1, {})
      // 1
      Reflect.setPrototypeOf(1, {})
      // TypeError: Reflect.setPrototypeOf called on non-object
      // 如果是null和undefined
      Object.setPrototypeOf(null, {})
      // TypeError: Object.setPrototypeOf called on null or undefined
      Reflect.setPrototypeOf(null, {})
      // TypeError: Reflect.setPrototypeOf called on non-object
    </script>
	</body>
</html>
